home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr47 / wasm223.zip / VIDEO2.ASM < prev    next >
Assembly Source File  |  1993-05-04  |  12KB  |  410 lines

  1. ;*******************************************;
  2. ; WASM Video Module, Mode Routines          ;
  3. ; By Eric Tauck                             ;
  4. ;                                           ;
  5. ; Defines:                                  ;
  6. ;                                           ;
  7. ;   VidTyp  return the adapter type         ;
  8. ;   ModSet  switch to a mode                ;
  9. ;   VidOpn  initialize the video routines   ;
  10. ;   VidClo  uninitialize the video routines ;
  11. ;                                           ;
  12. ; Requires:                                 ;
  13. ;                                           ;
  14. ;   VIDEO1.ASM                              ;
  15. ;*******************************************;
  16.  
  17.         call    VidTyp          ;get video type
  18.         mov     _vid_type, al   ;save it
  19.         jmp     _video2_end
  20.  
  21. _vid_type       DB      ?       ;video type
  22.  
  23. ;--- mode data
  24.  
  25. _vid_oldm       DB      0       ;mode before opening
  26. _vid_oldg       DB      0       ;hardware mode (i.e. saved graphics mode)
  27.  
  28. ;--- adapter types
  29.  
  30. MDA             EQU     1       ;monochrome display adapter
  31. CGAMON          EQU     2       ;color graphics adapter (monochrome)
  32. CGACOL          EQU     3       ;color graphics adapter
  33. EGAMON          EQU     4       ;enhanced graphics adapter, monochrome
  34. EGACOL          EQU     5       ;enhanced graphics adapter, color
  35. VGAMON          EQU     6       ;video graphics array, monochrome
  36. VGACOL          EQU     7       ;video graphics array, color
  37. MCGAMON         EQU     8       ;multi-color graphics adapter, monochrome
  38. MCGACOL         EQU     9       ;multi-color graphics adapter, color
  39.  
  40. ;========================================
  41. ; Determine the adapter type from the
  42. ; current video mode. Used locally if the
  43. ; adapter type cannot be otherwise
  44. ; determined.
  45. ;
  46. ; Out: AL= adapter type; CY= set if error.
  47.  
  48. VidTypM PROC  NEAR
  49.         mov     ah, 15          ;get video information
  50.         int     10H             ;execute
  51.         cmp     al, 7           ;check maximum valid mode
  52.         ja      _vdtym1
  53.  
  54. ;--- return mode from table
  55.  
  56.         mov     bl, al                  ;load BL
  57.         sub     bh, bh                  ;BX has index
  58.         mov     al, [_vid_modetrans+bx] ;return adapter type
  59.         clc
  60.         ret
  61.  
  62. ;--- error
  63.  
  64. _vdtym1 sub     al, al  ;return zero
  65.         stc
  66.         ret
  67.  
  68. ;--- video mode to adapter translation table, 0 to 7
  69.  
  70. _vid_modetrans  DB      CGAMON, CGACOL, CGAMON, CGACOL
  71.                 DB      CGACOL, CGAMON, CGACOL, MDA
  72.         ENDP
  73.  
  74. ;========================================
  75. ; Determine the current adapter type.
  76. ;
  77. ; Out: AL= adapter type; CY= set if
  78. ;      error.
  79.  
  80. VidTyp  PROC   NEAR
  81.  
  82. ;--- try reading display combination code
  83.  
  84.         mov     ax, 1A00H       ;get display combination code function
  85.         int     10H             ;execute
  86.         cmp     al, 1AH         ;check if function supported
  87.         jne     _vdtyp1         ;jump if not
  88.  
  89.         cmp     bl, 12          ;check range
  90.         ja      _vdtyp4         ;jump if error
  91.         sub     bh, bh
  92.         mov     al, [_vid_BIOStrans+bx] ;load adapter type
  93.         or      al, al                  ;check if invalid type
  94.         je      _vdtyp4
  95.         cmp     al, CGACOL      ;check if CGA
  96.         jne     _vdtyp3
  97.         push    ax
  98.         call    VidTypM         ;check mode
  99.         pop     dx
  100.         cmp     al, CGAMON      ;see if in mono mode
  101.         je      _vdtyp3
  102.         mov     al, dl          ;return original mode
  103.         jmps    _vdtyp3
  104.  
  105. ;--- combination code failed, try EGA query
  106.  
  107. _vdtyp1 mov     ah, 12H         ;EGA alternate function
  108.         mov     bl, 10H         ;return information subfunction
  109.         int     10H             ;execute
  110.         cmp     bl, 10H         ;check if supported
  111.         je      _vdtyp2         ;jump if not
  112.  
  113.         xor     al, 1           ;set ZF if mono
  114.         mov     al, EGAMON      ;load mono type
  115.         jz      _vdtyp3
  116.         mov     al, EGACOL      ;load color type
  117.         jmps    _vdtyp3
  118.  
  119. ;--- EGA query failed, go by mode
  120.  
  121. _vdtyp2 call    VidTypM         ;determine adapter by mode
  122.         jc      _vdtyp4
  123.  
  124. ;--- finished
  125.  
  126. _vdtyp3 clc
  127.         ret
  128.  
  129. ;--- error
  130.  
  131. _vdtyp4 sub     al, al          ;return zero
  132.         stc
  133.         ret
  134.  
  135. ;--- BIOS adapter type to adapter translation table, 0 to 12
  136.  
  137. _vid_BIOStrans  DB      0, MDA, CGACOL, 0, EGACOL, EGAMON, 0
  138.                 DB      VGAMON, VGACOL, 0, 0, MCGAMON, MCGACOL
  139.  
  140.         ENDP
  141.  
  142. ;========================================
  143. ; Set the current mode.
  144. ;
  145. ; In: AL= mode
  146. ;
  147. ; Out: CY= set if error.
  148.  
  149. ModSet  PROC    NEAR
  150.         push    ax
  151.         call    ModGet          ;get mode
  152.         mov     dl, al
  153.         pop     ax
  154.         cmp     dl, al          ;check if same
  155.         je      _mdset6         ;exit if so
  156.  
  157. ;--- find data for setting mode
  158.  
  159.         push    ax
  160.         call    VidTyp          ;get the adapter type
  161.         pop     bx
  162.         jc      _mdset2         ;jump if error
  163.         dec     ax
  164.         xchg    ax, bx          ;swap mode and adapter
  165.         sub     bh, bh
  166.         shl     bx
  167.         shl     bx                      ;adapter * 4, offset into index table
  168.         mov     cx, [_vid_adpttabs+bx+2] ;load number of valid modes
  169.         mov     bx, [_vid_adpttabs+bx]  ;load address of mode data
  170.  
  171. _mdset1 cmp     al, [bx]        ;check if mode matches
  172.         je      _mdset3         ;jump if so
  173.         add     bx, 4           ;next entry
  174.         loop    _mdset1         ;loop back
  175.  
  176. ;--- error
  177.  
  178. _mdset2 stc
  179.         ret
  180.  
  181. ;--- found mode data, set scan lines
  182.  
  183. _mdset3 push    ax              ;save mode
  184.  
  185.         mov     al, [bx+2]      ;load scan lines
  186.         cmp     al, _vid_SLNONE ;check if set scan lines
  187.         je      _mdset4         ;skip if not
  188.  
  189.         push    bx
  190.         mov     ah, 12H         ;alternate select function
  191.         mov     bl, 30H         ;set text scan lines subfunction
  192.         int     10H             ;execute
  193.         pop     bx
  194.  
  195. ;--- set hardware mode
  196.  
  197. _mdset4 push    bx
  198.         mov     ah, 0           ;set mode function
  199.         mov     al, [bx+1]      ;load mode
  200.         int     10H             ;execute
  201.         pop     bx
  202.  
  203. ;--- set font
  204.  
  205.         mov     al, [bx+3]      ;load font
  206.         cmp     al, _vid_FNNONE ;check if set font
  207.         je      _mdset5         ;skip if not
  208.  
  209.         mov     ah, 11H         ;character generator function
  210.         sub     bl, bl          ;block zero
  211.         int     10H             ;execute
  212.  
  213. ;--- finished
  214.  
  215. _mdset5 call    ModGet          ;get mode
  216.         pop     dx
  217.         jc      _mdset2         ;exit if error
  218.         cmp     dl, al          ;check if same
  219.         jne     _mdset2         ;exit if error
  220.  
  221. _mdset6 call    VidInit         ;initialize data
  222.         ret
  223.  
  224. ;--- index table to mode switching data
  225.  
  226. _vid_adpttabs LABEL      WORD
  227.         DW      OFFSET _vid_MDA, 1
  228.         DW      OFFSET _vid_CGAMON, 2
  229.         DW      OFFSET _vid_CGACOL, 2
  230.         DW      OFFSET _vid_EGAMON, 2
  231.         DW      OFFSET _vid_EGACOL, 4
  232.         DW      OFFSET _vid_VGAMON, 5
  233.         DW      OFFSET _vid_VGACOL, 14
  234.         DW      OFFSET _vid_MCGAMON, 1
  235.         DW      OFFSET _vid_MCGACOL, 1
  236.  
  237. ;--- scan line constants
  238.  
  239. _vid_SL200      EQU     000H    ;200
  240. _vid_SL350      EQU     001H    ;350
  241. _vid_SL400      EQU     002H    ;400
  242. _vid_SLNONE     EQU     0FFH    ;not defined
  243.  
  244. ;--- font pointer constants
  245.  
  246. _vid_FN8X8      EQU     012H    ;8x8
  247. _vid_FN8X14     EQU     011H    ;8x14
  248. _vid_FN8X16     EQU     014H    ;8x16
  249. _vid_FNNONE     EQU     0FFH    ;not defined
  250.  
  251. ;--- MDA modes
  252.  
  253. _vid_MDA LABEL  BYTE
  254.         DB      TEXT8025, 07H, _vid_SLNONE, _vid_FNNONE
  255.  
  256. ;--- modes
  257.  
  258. _vid_CGAMON LABEL       BYTE
  259.         DB      TEXT4025, 00H, _vid_SLNONE, _vid_FNNONE
  260.         DB      TEXT8025, 02H, _vid_SLNONE, _vid_FNNONE
  261.  
  262. ;--- CGACOL modes
  263.  
  264. _vid_CGACOL LABEL       BYTE
  265.         DB      TEXT4025, 01H, _vid_SLNONE, _vid_FNNONE
  266.         DB      TEXT8025, 03H, _vid_SLNONE, _vid_FNNONE
  267.  
  268. ;--- EGAMON modes
  269.  
  270. _vid_EGAMON LABEL       BYTE
  271.         DB      TEXT8025, 07H, _vid_SLNONE, _vid_FNNONE
  272.         DB      TEXT8043, 07H, _vid_SLNONE, _vid_FN8X8
  273.  
  274. ;--- EGACOL modes
  275.  
  276. _vid_EGACOL LABEL       BYTE
  277.         DB      TEXT4025, 01H, _vid_SLNONE, _vid_FNNONE
  278.         DB      TEXT4043, 01H, _vid_SLNONE, _vid_FN8X8
  279.         DB      TEXT8025, 03H, _vid_SLNONE, _vid_FNNONE
  280.         DB      TEXT8043, 03H, _vid_SLNONE, _vid_FN8X8
  281.  
  282. ;--- VGAMON modes
  283.  
  284. _vid_VGAMON LABEL       BYTE
  285.         DB      TEXT8021, 7, _vid_SL350, _vid_FN8X16
  286.         DB      TEXT8025, 7, _vid_SL400, _vid_FNNONE
  287.         DB      TEXT8028, 7, _vid_SL400, _vid_FN8X14
  288.         DB      TEXT8043, 7, _vid_SL350, _vid_FN8X8
  289.         DB      TEXT8050, 7, _vid_SL400, _vid_FN8X8
  290.  
  291. ;--- VGACOL modes
  292.  
  293. _vid_VGACOL LABEL       BYTE
  294.         DB      TEXT4012, 1, _vid_SL200, _vid_FN8X16
  295.         DB      TEXT4014, 1, _vid_SL200, _vid_FN8X14
  296.         DB      TEXT4021, 1, _vid_SL350, _vid_FN8X16
  297.         DB      TEXT4025, 1, _vid_SL400, _vid_FNNONE
  298.         DB      TEXT4028, 1, _vid_SL400, _vid_FN8X14
  299.         DB      TEXT4043, 1, _vid_SL350, _vid_FN8X8
  300.         DB      TEXT4050, 1, _vid_SL400, _vid_FN8X8
  301.         DB      TEXT8012, 3, _vid_SL200, _vid_FN8X16
  302.         DB      TEXT8014, 3, _vid_SL200, _vid_FN8X14
  303.         DB      TEXT8021, 3, _vid_SL350, _vid_FN8X16
  304.         DB      TEXT8025, 3, _vid_SL400, _vid_FNNONE
  305.         DB      TEXT8028, 3, _vid_SL400, _vid_FN8X14
  306.         DB      TEXT8043, 3, _vid_SL350, _vid_FN8X8
  307.         DB      TEXT8050, 3, _vid_SL400, _vid_FN8X8
  308.  
  309. ;--- MCGAMON modes
  310.  
  311. _vid_MCGAMON LABEL      BYTE
  312.         DB      TEXT8025, 7, _vid_SLNONE, _vid_FNNONE
  313.  
  314. ;--- MCGACOL modes
  315.  
  316. _vid_MCGACOL LABEL      BYTE
  317.         DB      TEXT8025, 03H, _vid_SLNONE, _vid_FNNONE
  318.  
  319.         ENDP
  320.  
  321. ;========================================
  322. ; Initialize video data. Preserve the
  323. ; current mode and switch to new mode.
  324. ;
  325. ; In: AL= text mode.
  326. ;
  327. ; Out: CY= set if error.
  328.  
  329. VidOpn  PROC   NEAR
  330.         push    ax
  331.  
  332. ;--- save the text mode
  333.  
  334.         call    ModGet          ;get mode
  335.         mov     _vid_oldm, al   ;save it
  336.         mov     ax, 1200H       ;enable palette setting
  337.         jc      _vdopn1         ;jump if invalid text mode
  338.         inc     al              ;disable palette setting
  339.  
  340. _vdopn1 cmp     _vid_type, VGAMON       ;check video type
  341.         jb      _vdopn2                 ;skip if not VGA
  342.         mov     bl, 31H                 ;subfunction
  343.         int     10H                     ;execute
  344.  
  345. ;--- save the hardware mode (in case invalid text mode above)
  346.  
  347. _vdopn2 mov     ah, 0FH         ;video information function
  348.         int     10H
  349.         mov     _vid_oldg, al   ;save hardware mode
  350.  
  351. ;--- switch to the new mode
  352.  
  353.         pop     ax              ;restore mode
  354.         call    ModSet          ;switch to mode
  355.         jc      _vdopn4
  356.  
  357.         cmp     _vid_type, VGAMON       ;check video type
  358.         jb      _vdopn3                 ;skip if not VGA
  359.  
  360.         mov     ax, 1201H       ;disable palette setting
  361.         mov     bl, 31H         ;subfunction
  362.         int     10H             ;execute
  363. _vdopn3 clc
  364.         ret
  365.  
  366. ;--- error, close video
  367.  
  368. _vdopn4 call    VidClo          ;reset video
  369.         stc
  370.         ret
  371.         ENDP
  372.  
  373. ;========================================
  374. ; Close video. Restore old mode.
  375.  
  376. VidClo  PROC NEAR
  377.         mov     al, _vid_oldm   ;symbolic mode
  378.         or      al, al          ;check if valid
  379.         jnz     _vdclo2
  380.  
  381. ;--- restore unrecognized mode
  382.  
  383.         cmp     _vid_type, VGAMON       ;check video type
  384.         jb      _vdclo1                 ;skip if not VGA
  385.  
  386.         mov     ax, 1200H       ;enable palette loading
  387.         mov     bl, 31H         ;subfunction
  388.         int     10H             ;execute
  389.  
  390. _vdclo1 mov     al, _vid_oldg   ;use saved hardware mode
  391.         sub     ah, ah
  392.         int     10H
  393.         ret
  394.  
  395. ;--- restore text mode
  396.  
  397. _vdclo2 call    ModSet          ;set mode
  398.  
  399.         cmp     _vid_type, VGAMON       ;check video type
  400.         jb      _vdclo3                 ;skip if not VGA
  401.  
  402.         mov     ax, 1200H       ;enable palette loading
  403.         mov     bl, 31H         ;subfunction
  404.         int     10H             ;execute
  405.  
  406. _vdclo3 ret
  407.         ENDP
  408.  
  409. _video2_end
  410.